package primary;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解不是注释!!!
 * <p>
 * 1.它不是程序本身,可以对程序作出解释.(这一点和注释没有区别)
 * 2. 注解可以被其他程序读取(如编译器).注解信息处理流程是注解和注释的重大区别
 * <p>
 * 注解的格式:
 * 注解是以 "@注释名",在代码中存在的,还可以添加一些参数值
 * <p>
 * <p>
 * 注解可以附加在package、class、method、field上边，相当于给他们添加额外的辅助信息。
 * 也可以通过反射机制编程实现对这些元数据的访问
 */
@AnaTest
public class L_Annotation {
    @Override//  @Override就是一个注解,告诉编译器重写了一个父类的方法
    public String toString() {
        return super.toString();
    }

    @AnaTest(studentName = "yeung")
    public void test01() {
    }

    @Yeung("this is name")
    public void test02() {

    }
}

//表示注解AnaTest只能用于方法上类型上
//可指定target多个参数
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
//在运行时有效, 可被反射机制读取
@interface AnaTest {
    //可以添加注解的参数
    String studentName() default "";

    int age() default 0;

    int id() default -1;

    String[] Schools() default {"清华大学", "南开大学"};
}

@Retention(RetentionPolicy.RUNTIME)
@interface Yeung {
    String value();
}

